#!/bin/sh
# Copyright 1994, 1998, 2000  Patrick Volkerding, Concord, CA, USA 
# Copyright 2001, 2003  Slackware Linux, Inc., Concord, CA, USA
# Copyright 2007, 2009, 2011  Patrick Volkerding, Sebeka, MN, USA 
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Fri Apr 22 20:45:45 UTC 2011
# A stronger formula is needed to regularize output that will be parsed.
unset LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY \
  LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT \
  LC_IDENTIFICATION LC_ALL
LANG=C
export LANG
#
# Thu Apr 21 17:31:29 UTC 2011
# Set LC_MESSAGES=C to avoid output parsing issues.
# Might as well do that right now.
#LC_MESSAGES=C
#export LC_MESSAGES
#
# Sat Apr 25 21:18:53 UTC 2009
# Converted to use new pkgbase() function to remove pathname and
# valid package extensions.
#
# Sat Apr  4 22:58:06 CDT 2009
# Support additional compression formats if the supporting utilities exist:
# .tbz - bzip2
# .tlz - lzma
# .txz - xz (also LZMA)
# And of course, .tgz (gzip) is not going anywhere.  :-) <volkerdi>
# Add command switches to determine the uncompressed package size even if
# that will slow things down, and to add the package's md5sum to the
# metadata stored in /var/log/packages/.
#
# Fri Dec 21 17:21:35 CST 2007
# Added a patch from Johnny Morano to work around package removal issues
# caused by packages that do not comply with FHS combined with a grep
# regex error in installpkg.  Any package with a single-letter top-
# level directory could not be removed.
#
# Shortened some of the top-line dialog output to avoid overflowing the
# textbox (needed as some of the packages, especially in X, have very
# long base package names now).  <pjv>
#
# Sun Nov 26 12:38:25 CST 1995
# Added patch from Glenn Moloney <glenn@physics.unimelb.edu.au> to allow
# packages to be installed to directories other than /.
#
# Wed Mar 18 15:15:51 CST 1998
# Changed $TMP directory to /var/log/setup/tmp, and chmod'ed it 700 to close
# some security holes.

# Return a package name that has been stripped of the dirname portion
# and any of the valid extensions (only):
pkgbase() {
  PKGEXT=$(echo $1 | rev | cut -f 1 -d . | rev)
  case $PKGEXT in
  'tgz' )
    PKGRETURN=$(basename $1 .tgz)
    ;;
  'tbz' )
    PKGRETURN=$(basename $1 .tbz)
    ;;
  'tlz' )
    PKGRETURN=$(basename $1 .tlz)
    ;;
  'txz' )
    PKGRETURN=$(basename $1 .txz)
    ;;
  *)
    PKGRETURN=$(basename $1)
    ;;
  esac
  echo $PKGRETURN
}

# If installpkg encounters a problem, it will return a non-zero error code.
# If it finds more than one problem (i.e. with a list of packages) you'll only
# hear about the most recent one. :)
# 1 = tar returned error code
# 2 = corrupt compression envelope
# 3 = does not end in .tgz
# 4 = no such file
# 5 = external compression utility missing
# 99 = user abort from menu mode
EXITSTATUS=0

# Do not store md5sums by default:
MD5SUM=0

# So that we know what to expect...
umask 022
TAR=tar-1.13
$TAR --help 1> /dev/null 2> /dev/null
if [ ! $? = 0 ]; then
  TAR=tar
fi
if [ ! "$(LC_MESSAGES=C $TAR --version)" = "tar (GNU tar) 1.13

Copyright (C) 1988, 92,93,94,95,96,97,98, 1999 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Written by John Gilmore and Jay Fenlason." ]; then
  echo "WARNING: pkgtools are unstable with tar > 1.13."
  echo "         You should provide a \"tar-1.13\" in your \$PATH."
  sleep 5
fi

usage() {
 cat << EOF
Usage: installpkg [options] <package_filename>

Installpkg is used to install a .t{gz,bz,lz,xz} package like this:
   installpkg slackware-package-1.0.0-i486-1.tgz (or .tbz, .tlz, .txz)

options:      --warn (warn if files will be overwritten, but do not install)
              --root /mnt (install someplace else, like /mnt)
              --infobox (use dialog to draw an info box)
              --terse (display a one-line short description for install)
              --menu (confirm package installation with a menu, unless
                    the priority is [required] or ADD)
              --ask (used with menu mode: always ask if a package should be
                   installed regardless of what the package's priority is)
              --priority ADD|REC|OPT|SKP  (provide a priority for the entire
                    package list to use instead of the priority in the
                    tagfile)
              --tagfile /somedir/tagfile (specify a different file to use
                    for package priorities.  The default is "tagfile" in
                    the package's directory)
              --md5sum (record the package's md5sum in the metadata file)

EOF
}

# Eliminate whitespace function:
crunch() {
  while read FOO ; do
    echo $FOO
  done
}

package_name() {
  STRING=$(pkgbase $1)
  # Check for old style package name with one segment:
  if [ "$(echo $STRING | cut -f 1 -d -)" = "$(echo $STRING | cut -f 2 -d -)" ]; then
    echo $STRING
  else # has more than one dash delimited segment
    # Count number of segments:
    INDEX=1
    while [ ! "$(echo $STRING | cut -f $INDEX -d -)" = "" ]; do
      INDEX=$(expr $INDEX + 1)
    done
    INDEX=$(expr $INDEX - 1) # don't include the null value
    # If we don't have four segments, return the old-style (or out of spec) package name:
    if [ "$INDEX" = "2" -o "$INDEX" = "3" ]; then
      echo $STRING
    else # we have four or more segments, so we'll consider this a new-style name:
      NAME=$(expr $INDEX - 3)
      NAME="$(echo $STRING | cut -f 1-$NAME -d -)"
      echo $NAME
      # cruft for later ;)
      #VER=$(expr $INDEX - 2)
      #VER="$(echo $STRING | cut -f $VER -d -)"
      #ARCH=$(expr $INDEX - 1)
      #ARCH="$(echo $STRING | cut -f $ARCH -d -)"
      #BUILD="$(echo $STRING | cut -f $INDEX -d -)"
    fi
  fi
}

# Parse options:
MODE=install # standard text-mode
while [ 0 ]; do
  if [ "$1" = "-warn" -o "$1" = "--warn" ]; then
    MODE=warn
    shift 1
  elif [ "$1" = "-md5sum" -o "$1" = "--md5sum" ]; then
    MD5SUM=1
    shift 1
  elif [ "$1" = "-infobox" -o "$1" = "--infobox" ]; then
    MODE=infobox
    shift 1
  elif [ "$1" = "-terse" -o "$1" = "--terse" ]; then
    MODE=terse
    shift 1
  elif [ "$1" = "-menu" -o "$1" = "--menu" ]; then
    MODE=menu
    shift 1
  elif [ "$1" = "-ask" -o "$1" = "--ask" ]; then
    ALWAYSASK="yes"
    shift 1
  elif [ "$1" = "-tagfile" -o "$1" = "--tagfile" ]; then
    if [ -r "$2" ]; then
      USERTAGFILE="$2"
    elif [ -r "$(pwd)/$2" ]; then
      USERTAGFILE="$(pwd)/$2"
    else
      usage
      exit
    fi
    shift 2
  elif [ "$1" = "-priority" -o "$1" = "--priority" ]; then
    if [ "$2" = "" ]; then
      usage
      exit
    fi
    USERPRIORITY="$2"
    shift 2
  elif [ "$1" = "-root" -o "$1" = "--root" ]; then
    if [ "$2" = "" ]; then
      usage
      exit
    fi
    ROOT="$2"
    shift 2
  else
    break
  fi
done

# Set the prefix for the package database directories (packages, scripts).
ADM_DIR="$ROOT/var/log"
# If the directories don't exist, "initialize" the package database:
for PKGDBDIR in packages removed_packages removed_scripts scripts setup ; do
  if [ ! -d $ADM_DIR/$PKGDBDIR ]; then
    rm -rf $ADM_DIR/$PKGDBDIR # make sure it's not a symlink or something stupid
    mkdir -p $ADM_DIR/$PKGDBDIR
    chmod 755 $ADM_DIR/$PKGDBDIR 
  fi
done

# Make sure there's a proper temp directory:
TMP=$ADM_DIR/setup/tmp
# If the $TMP directory doesn't exist, create it:
if [ ! -d $TMP ]; then
  rm -rf $TMP # make sure it's not a symlink or something stupid
  mkdir -p $TMP
  chmod 700 $TMP # no need to leave it open
fi

# usage(), exit if called with no arguments:
if [ $# = 0 ]; then
  usage;
  exit
fi

# If -warn mode was requested, produce the output and then exit:
if [ "$MODE" = "warn" ]; then
  while [ -f "$1" ]; do
    mkdir -p $TMP/scan$$
    # Determine extension:
    packageext="$( echo $1 | rev | cut -f 1 -d . | rev)"
    # Determine compressor utility:
    case $packageext in
    'tgz' )
      packagecompression=gzip
      ;;
    'tbz' )
      packagecompression=bzip2
      ;;
    'tlz' )
      packagecompression=lzma
      ;;
    'txz' )
      packagecompression=xz
      ;;
    esac
    ( cd $TMP/scan$$ ; $packagecompression -dc | $TAR xf - install ) < $1 2> /dev/null 
    if [ -r $TMP/scan$$/install/doinst.sh ]; then
      if cat $TMP/scan$$/install/doinst.sh | grep ' rm -rf ' 1>/dev/null 2>/dev/null ; then
        cat $TMP/scan$$/install/doinst.sh | grep ' rm -rf ' > $TMP/scan$$/install/delete
	for f in `cat $TMP/scan$$/install/delete | cut -f 3,7 -d ' ' | tr ' ' '/'`; do
	  f="/$f"
	  if [ -f "$f" -o -L "$f" ]; then
	    echo "$f"
	  fi
	done
      fi
      if [ -d $TMP/scan$$ ]; then
        ( cd $TMP/scan$$ ; rm -rf install ) 2> /dev/null
        ( cd $TMP ; rmdir scan$$ ) 2> /dev/null
      fi
    fi
    for f in `( $packagecompression -dc | $TAR tf - ) < $1 | grep -v 'drwx'`; do
      f="/$f"
      if [ -f "$f" -o -L "$f" ]; then
        echo "$f"
      fi
    done
    shift 1
  done
  exit
fi

# Main loop:
for package in $* ; do

  # Simple package integrity check:
  if [ ! -f $package ]; then
    EXITSTATUS=4
    if [ "$MODE" = "install" ]; then
      echo "Cannot install $package:  file not found"
    fi
    continue;
  fi

  # "shortname" isn't really THAT short...
  # it's just the full name without ".t{gz,bz,lz,xz}"
  shortname="$(pkgbase $package)"
  packagedir="$(dirname $package)"
  # This is the base package name, used for grepping tagfiles and descriptions:
  packagebase="$(package_name $shortname)"

  # Reject package if it does not end in '.t{gz,bz,lz,xz}':
  if [ "$shortname" = "$(basename $package)" ]; then
    EXITSTATUS=3
    if [ "$MODE" = "install" ]; then
      echo "Cannot install $package:  file does not end in .tgz, .tbz, .tlz, or .txz"
    fi
    continue;
  fi

  # Determine extension:
  packageext="$(echo $package | rev | cut -f 1 -d . | rev)"

  # Determine compressor utility:
  case $packageext in
  'tgz' )
    packagecompression=gzip
    ;;
  'tbz' )
    packagecompression=bzip2
    ;;
  'tlz' )
    packagecompression=lzma
    ;;
  'txz' )
    packagecompression=xz
    ;;
  esac

  # Test presence of external compression utility:
  if ! $packagecompression --help 1> /dev/null 2> /dev/null ; then
    EXITSTATUS=5
    if [ "$MODE" = "install" ]; then
      echo "Cannot install $package:  external compression utility $packagecompression missing"
    fi
    continue;
  fi

  # Determine package's priority:
  unset PRIORITY
  if [ "$USERTAGFILE" = "" ]; then
    TAGFILE="$packagedir/tagfile"   
  else
    TAGFILE="$USERTAGFILE"
  fi
  if [ ! -r "$TAGFILE" ]; then
    TAGFILE=/dev/null
  fi
  if grep "^$packagebase:" "$TAGFILE" | grep ADD > /dev/null 2> /dev/null ; then
    PRIORITY="ADD"
  elif grep "^$packagebase:" "$TAGFILE" | grep REC > /dev/null 2> /dev/null ; then
    PRIORITY="REC"
  elif grep "^$packagebase:" "$TAGFILE" | grep OPT > /dev/null 2> /dev/null ; then
    PRIORITY="OPT"
  elif grep "^$packagebase:" "$TAGFILE" | grep SKP > /dev/null 2> /dev/null ; then
    PRIORITY="SKP"
  fi
  if [ "$PRIORITY" = "ADD" ]; then
    PMSG="[ADD]"
  elif [ "$PRIORITY" = "REC" ]; then
    PMSG="[REC]"
  elif [ "$PRIORITY" = "OPT" ]; then
    PMSG="[OPT]"
  elif [ "$PRIORITY" = "SKP" ]; then
    PMSG="[SKP]"
  else
    PMSG=""
  fi

  # If a tagfile wants this package to be skipped, do that now before
  # wasting any more CPU on it:
  if [ "$PRIORITY" = "SKP" -a ! "$ALWAYSASK" = "yes" ]; then
    continue # next package
  fi

  # Figure out some package information, like the compressed and uncompressed
  # sizes, and where to find the package description:
  COMPRESSED="$(/bin/du -sh "$(readlink -f $package)" | cut -f 1)"
  DESCRIPTION=""
  # First check for .txt file next to the package, since this is faster:
  if grep "^$packagebase:" "$packagedir/$shortname.txt" 1> /dev/null 2> /dev/null ; then
    DESCRIPTION="$packagedir/$shortname.txt"
  elif grep "^$shortname:" "$packagedir/$shortname.txt" 1> /dev/null 2> /dev/null ; then
    DESCRIPTION="$packagedir/$shortname.txt"
  fi

  # Test tarball integrity and get uncompressed package size:
  if [ "$MODE" = "install" ]; then
    echo "Verifying package $(basename $package)."
  fi
  cat $package | $packagecompression -dc | dd 2> $TMP/tmpsize$$ | $TAR tf - 1> $TMP/tmplist$$ 2> /dev/null
  TARERROR=$?
  if [ ! "$TARERROR" = "0" ]; then
    EXITSTATUS=1 # tar file corrupt
    if [ "$MODE" = "install" ]; then
      echo "Unable to install $package:  tar archive is corrupt (tar returned error code $TARERROR)"
    fi
    rm -f $TMP/tmplist$$ $TMP/tmpsize$$
    continue
  fi
  UNCOMPRESSED="$(expr $(cat $TMP/tmpsize$$ | head -n 1 | cut -f 1 -d +) / 2)"
  if [ $UNCOMPRESSED -lt 1024 ]; then
    UNCOMPRESSED="${UNCOMPRESSED}K"
  elif [ $UNCOMPRESSED -lt 10239 ]; then
    UNCOMPRESSED="$(expr $UNCOMPRESSED \* 1000 / 1024 | cut -b1).$(expr $UNCOMPRESSED \* 1000 / 1024 | cut -b2)M"
  else
    UNCOMPRESSED="$(expr $UNCOMPRESSED / 1024)M"
  fi
  rm -f $TMP/tmpsize$$

  # If we still don't have a package description, look inside the package.
  # This requires a costly untar.
  if [ "$DESCRIPTION" = "" ]; then
    mkdir -p $TMP/scan$$
    ( cd $TMP/scan$$ ; $packagecompression -dc | $TAR xf - install ) < $package 2> /dev/null
    if grep "^$packagebase:" "$TMP/scan$$/install/slack-desc" 1> /dev/null 2> /dev/null ; then
      DESCRIPTION="$TMP/scan$$/install/slack-desc"
    elif grep "^$shortname:" "$TMP/scan$$/install/slack-desc" 1> /dev/null 2> /dev/null ; then
      DESCRIPTION="$TMP/scan$$/install/slack-desc"
    fi
  fi

  if [ "$DESCRIPTION" = "" ]; then
    #echo "WARNING NO SLACK-DESC"
    DESCRIPTION="/dev/null"
  fi

  # Gather package infomation into a temporary file:
  cat $DESCRIPTION | grep "^$packagebase:" | cut -f 2- -d : | cut -b2- 1> $TMP/tmpmsg$$ 2> /dev/null
  if [ "$shortname" != "$packagebase" ]; then
    cat $DESCRIPTION | grep "^$shortname:" | cut -f 2- -d : | cut -b2- 1>> $TMP/tmpmsg$$ 2> /dev/null
  fi
  # Adjust the length here.  This allows a slack-desc to be any size up to 13 lines instead of fixed at 11.
  LENGTH=$(cat $TMP/tmpmsg$$ | wc -l)
  while [ $LENGTH -lt 12 ]; do
    echo >> $TMP/tmpmsg$$
    LENGTH=$(expr $LENGTH + 1)
  done
  # echo "Size: Compressed: ${COMPRESSED}, uncompressed: ${UNCOMPRESSED}." >> $TMP/tmpmsg$$
  # For recent versions of dialog it is necessary to add \n to the end of each line
  # or it will remove repeating spaces and mess up our careful formatting:
  cat << EOF > $TMP/controlns$$
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
EOF
  paste -d "" $TMP/tmpmsg$$ $TMP/controlns$$ > $TMP/pasted$$
  rm -f $TMP/controlns$$
  mv $TMP/pasted$$ $TMP/tmpmsg$$
  # Emit information to the console:
  if [ "$MODE" = "install" ]; then
    if [ "$PMSG" = "" ]; then
      echo "Installing package $(basename $package):"
    else
      echo "Installing package $(basename $package) $PMSG:"
    fi
    echo "PACKAGE DESCRIPTION:"
    cat $DESCRIPTION | grep "^$packagebase:" | uniq | sed "s/^$packagebase:/#/g"
    if [ "$shortname" != "$packagebase" ]; then
      cat $DESCRIPTION | grep "^$shortname:" | uniq | sed "s/^$shortname:/#/g"
    fi
  elif [ "$MODE" = "terse" ]; then # emit a single description line
    printf "%-72s %-6s\n" "$(echo $shortname: $(cat $DESCRIPTION | grep "^$packagebase:" | sed "s/^$packagebase: //g" | head -n 1 | tr -d '()' | sed "s/^$packagebase //g" ) | cut -b1-72)" "[${UNCOMPRESSED}]" | cut -b1-80
  elif [ "$MODE" = "infobox" ]; then # install infobox package
    dialog --title "Installing package $shortname $PMSG" --infobox "$(cat $TMP/tmpmsg$$)" 0 0
  elif [ "$MODE" = "menu" -a "$PRIORITY" = "ADD" -a ! "$ALWAYSASK" = "yes" ]; then # ADD overrides menu mode unless -ask was used
    dialog --title "Installing package $shortname $PMSG" --infobox "$(cat $TMP/tmpmsg$$)" 0 0
  elif [ "$MODE" = "menu" -a "$USERPRIORITY" = "ADD" ]; then # install no matter what $PRIORITY
    dialog --title "Installing package $shortname $PMSG" --infobox "$(cat $TMP/tmpmsg$$)" 0 0
  else # we must need a full menu:
    dialog --title "Package Name: $shortname $PMSG" --menu "$(cat $TMP/tmpmsg$$)" 0 0 3 \
    "Yes" "Install package $shortname" \
    "No" "Do not install package $shortname" \
    "Quit" "Abort software installation completely" 2> $TMP/reply$$
    if [ ! $? = 0 ]; then
      echo "No" > $TMP/reply$$
    fi
    REPLY="$(cat $TMP/reply$$)"
    rm -f $TMP/reply$$ $TMP/tmpmsg$$
    if [ "$REPLY" = "Quit" ]; then
      exit 99 # EXIT STATUS 99 = ABORT!
    elif [ "$REPLY" = "No" ]; then
      continue # skip the package
    fi
  fi

  # Make sure there are no symbolic links sitting in the way of
  # incoming package files:
  cat $TMP/tmplist$$ | grep -v "/$" | while read file ; do
    if [ -L "$ROOT/$file" ]; then
      rm -f "$ROOT/$file"
    fi
  done
  rm -f $TMP/tmplist$$

  # Write the package file database entry and install the package:
  echo "PACKAGE NAME:     $shortname" > $ADM_DIR/packages/$shortname
  echo "COMPRESSED PACKAGE SIZE:     $COMPRESSED" >> $ADM_DIR/packages/$shortname
  echo "UNCOMPRESSED PACKAGE SIZE:     $UNCOMPRESSED" >> $ADM_DIR/packages/$shortname
  echo "PACKAGE LOCATION: $package" >> $ADM_DIR/packages/$shortname
  # Record the md5sum if that's a selected option:
  if [ $MD5SUM = 1 ]; then
    echo "PACKAGE MD5SUM: $(md5sum $package | cut -f 1 -d ' ')" >> $ADM_DIR/packages/$shortname
  fi
  echo "PACKAGE DESCRIPTION:" >> $ADM_DIR/packages/$shortname
  cat $DESCRIPTION | grep "^$packagebase:" >> $ADM_DIR/packages/$shortname 2> /dev/null
  if [ "$shortname" != "$packagebase" ]; then
    cat $DESCRIPTION | grep "^$shortname:" >> $ADM_DIR/packages/$shortname 2> /dev/null
  fi
  echo "FILE LIST:" >> $ADM_DIR/packages/$shortname
  ( cd $ROOT/ ; $packagecompression -dc | $TAR -xlUpvf - ) < $package >> $TMP/$shortname 2> /dev/null
  if [ "$(cat $TMP/$shortname | grep '^\./' | wc -l | tr -d ' ')" = "1" ]; then
    # Good.  We have a package that meets the Slackware spec.
    cat $TMP/$shortname >> $ADM_DIR/packages/$shortname
  else
    # Some dumb bunny built a package with something other than makepkg.  Bad!
    # Oh well.  Bound to happen.  Par for the course.  Fix it and move on...
    echo "WARNING:  Package has not been created with 'makepkg'"
    echo './' >> $ADM_DIR/packages/$shortname
    cat $TMP/$shortname >> $ADM_DIR/packages/$shortname
  fi
  rm -f $TMP/$shortname

  # It's a good idea to make sure those newly installed libraries
  # are properly activated for use:
  if [ -x /sbin/ldconfig ]; then
    /sbin/ldconfig
  fi

  if [ -f $ROOT/install/doinst.sh ]; then
    if [ "$MODE" = "install" ]; then
      echo "Executing install script for $(basename $package)."
    fi
    ( cd $ROOT/ ; sh install/doinst.sh -install; )
  fi 
  # Clean up the mess...
  if [ -d $ROOT/install ]; then
    if [ -r $ROOT/install/doinst.sh ]; then
      cp $ROOT/install/doinst.sh $ADM_DIR/scripts/$shortname
      chmod 755 $ADM_DIR/scripts/$shortname
    fi
    # /install/doinst.sh and /install/slack-* are reserved locations for the package system.
    ( cd $ROOT/install ; rm -f doinst.sh slack-* 1> /dev/null 2>&1 )
    rmdir $ROOT/install 1> /dev/null 2>&1
  fi
  # If we used a scan directory, get rid of it:
  if [ -d "$TMP/scan$$" ]; then
    rm -rf "$TMP/scan$$"
  fi
  rm -f $TMP/tmpmsg$$ $TMP/reply$$
  if [ "$MODE" = "install" ]; then
    echo "Package $(basename $package) installed."
    echo
  fi
done

exit $EXITSTATUS
